﻿// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter05/Simple Shader2" {
    Properties {
        // 生命一个 Color 类型的属性 _Color(注意在shader代码里要生命跟这个属性同名的变量才行)
        _Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
    }
    SubShader
    {
        Pass{
            CGPROGRAM
            // 告诉Unity vert 方法是顶点着色器
            #pragma vertex vert
            // 告诉Unity frag 方法是片元着色器
            #pragma fragment frag

            // 使用结构体来定义顶点着色器的输入
            struct a2v
            {
                // POSITION 语义,用模型空间点的顶点坐标填充 vertex 变量
                float4 vertex:POSITION;
                // NORMAL 语义,用模型空间点的法线方向填充 normal 变量
                float3 normal:NORMAL;
                // TEXCOORD0 语义,用模型的第一套纹理坐标填充 texcoord 变量
                float3 texcoord:TEXCOORD0;
            };
            // 顶点着色器 的语义是不能省略的!!!
            // 顶点着色器支持的输入有, POSITION, TANGENT, NORMAL, COLOR, TEXCOORD0, TEXCOORD1, TEXCOORD2, TEXCOORD03 等
            // 这些数据在引擎调用 Draw Call 之前, Mesh Render会把它负责渲染的模型数据发送给 Unity Shader


            // 定义顶点作色器的输出
            // 顶点作色器的输出必须包含 SV_POSITION zh这个语义
            struct v2f
            {
                // SV_POSITION 语义告诉Unity, pos里包含了顶点在裁剪空间中的位置信息
                float4 pos: SV_POSITION;
                // COLOR0 语义
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v){
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
                return o;
            }

            uniform fixed4 _Color;

            // SV_Target也是HLSL中的一个系统语义,告诉渲染器输出颜色存储到一个渲染目标
            // fragment shader 输出的颜色的每个分量取值范围是 [0,1]
            fixed4 frag(v2f i): SV_Target {
                // i.color是顶点作色器中,经过插值运算以后得到的
                fixed3 c = i.color;
                c *= _Color.rgb;
                return fixed4(c, 1.0);
            }
            ENDCG
        }
    }
}
